AliRTC2.5/Windows/Qt Demo/mainwindow.cpp (374 lines of code) (raw):

#include "shareFile.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "logindlg.h" #include "configScreenDlg.h" #include <QMessageBox> #include <QCloseEvent> #include <QDebug> #include <QDir> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , mpEngine(nullptr) , msUserName("") , mbAudio(true) , mbVideo(true) , mbAutoPub(true) , mbAutoSub(true) , mbH5Mode(true) , mbTrackQuality(true) , mICol(0) , mIShowNum(0) { ui->setupUi(this); this->setWindowIcon(QIcon(":/source/LOGO.ico")); initUserView(); QDir dir; QString str = QCoreApplication::applicationDirPath() + "\\��־"; dir.mkpath(str); QByteArray arr = str.toLocal8Bit(); AliEngine::SetLogDirPath(arr.data()); connect(this, SIGNAL(sendJoin(int)), this, SLOT(joinChannelResult(int))); connect(this, SIGNAL(sendUpdateView()), this, SLOT(updateView())); connect(ui->slider_white, SIGNAL(valueChanged(int)), this, SLOT(updateWhite(int))); connect(ui->slider_smooth, SIGNAL(valueChanged(int)), this, SLOT(updateSmooth(int))); connect(this, SIGNAL(SendAudioDeviceRecordLevel(int)), this, SLOT(onRecordLevelMsg(int))); connect(this, SIGNAL(SendAudioDevicePlayoutLevel(int)), this, SLOT(onPlayoutLevelMsg(int))); connect(this, SIGNAL(SendAudioDevicePlayoutEnd()), this, SLOT(onPlayoutEndMsg())); initEngine(); loginView(); } MainWindow::~MainWindow() { removeUserView(); delete ui; } void MainWindow::loginView() { LoginDlg dlg(this); if (dlg.exec() != QDialog::Accepted) { exit(0); } dlg.configInfo(msUserName, mbAutoPub, mbAudio, mbVideo, mbAutoSub, mbTrackQuality, mbH5Mode); ui->pushButton_left->setHidden(true); ui->pushButton_right->setHidden(true); mICol = 0; mIShowNum = 0; joinChannel(); } void MainWindow::initEngine() { AliEngine::SetH5CompatibleMode(mbH5Mode); if (nullptr == mpEngine) mpEngine = AliEngine::Create(""); mpEngine->SetEngineEventListener(this); mpEngine->SetLogLevel(AliEngineLogLevelInfo); mpEngine->PublishLocalAudioStream(mbAutoPub); mpEngine->PublishLocalVideoStream(mbAutoPub); mpEngine->PublishLocalDualStream(mbTrackQuality); mpEngine->SetDefaultSubscribeAllRemoteAudioStreams(mbAutoSub); mpEngine->SetDefaultSubscribeAllRemoteVideoStreams(mbAutoSub); } void MainWindow::joinChannel() { AliEngineAuthInfo authinfo;//��ע����Ҫ�ֶ������Ȩ��Ϣ https://help.aliyun.com/document_detail/146833.html?spm=5176.11065259.1996646101.searchclickresult.230e1c95nxlEcb#title-t41-agh-m2i //authinfo.appId = (char*)"xxxxxxx"; //authinfo.userId = (char*)"xxxxxxxxxxxxxxxxxxxxx"; //authinfo.channelId = (char*)"xxxxxxxxxxxxxx"; //authinfo.nonce = (char*)"AK-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //authinfo.gslbCount = 1; //authinfo.gslb = new char*[authinfo.gslbCount]; //for (int i = 0; i < authinfo.gslbCount; i++) //{ // authinfo.gslb[i] = (char*)"https://xxxxxxxxxxxxxxxxxxxxx.com"; //} //authinfo.agentCount = 1; //authinfo.agent = new char*[authinfo.agentCount]; //for (int i = 0; i < authinfo.agentCount; i++) //{ // authinfo.agent[i] = (char*)"xxxxxxxxxxxxxx.com"; //} //authinfo.token = (char*)"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //authinfo.timestamp = 1621476611; QMessageBox::warning(this, tr("��ʾ"), tr("1.���Լ��appserver��ȡ��ַ��2. ���ֶ������Ȩ��Ϣ��")); return ; QByteArray arrUserName = msUserName.toUtf8(); if (nullptr != mpEngine) mpEngine->JoinChannel(authinfo, arrUserName.data()); } void MainWindow::leaveChannel() { if (mpEngine->IsInCall()) { if (mpEngine->IsScreenSharePublished()) on_pushButton_Screen_clicked(); mpEngine->LeaveChannel(); } removeAllUser(); } void MainWindow::OnJoinChannelResult(int result, const char *channel, int elapsed) { emit sendJoin(result); } void MainWindow::closeEvent(QCloseEvent * event) { if (event->type() == QEvent::Close) { if (nullptr != mpEngine) { leaveChannel(); AliEngine::Destroy(); mpEngine = nullptr; } } } void MainWindow::joinChannelResult(int result) { if (0 == result) { AliEngineVideoCanvas canvas; canvas.displayView = (HWND)ui->lb_view->winId(); canvas.renderMode = AliEngineRenderMode::AliEngineRenderModeStretch; canvas.renderMode = AliEngineRenderMode::AliEngineRenderModeAuto; canvas.mirrorMode = AliEngineRenderMirrorModeAllNoMirror; mpEngine->SetLocalViewConfig(canvas, AliEngineVideoTrackCamera); mpEngine->StartPreview(); } else { QString strMsg = QString(tr("����Ƶ��ʧ�ܣ� �����룺%1")).arg(result); QMessageBox::warning(this, tr("����"), strMsg); loginView(); } } void MainWindow::OnLeaveChannelResult(int result, AliEngineStats stats) { } void MainWindow::OnRemoteUserOnLineNotify(const char *uid, int elapsed) { addUser(uid); } void MainWindow::OnRemoteUserOffLineNotify(const char *uid, AliEngineUserOfflineReason reason) { removeUser(uid); } void MainWindow::OnRemoteTrackAvailableNotify(const char *uid, AliEngineAudioTrack audioTrack, AliEngineVideoTrack videoTrack) { updateUser(uid, videoTrack); } void MainWindow::initUserView() { User_view* p = new User_view; p->pLbUserName = ui->lb_userName01; p->pLbView = ui->lb_view01; mVecUserView.push_back(p); p = new User_view; p->pLbUserName = ui->lb_userName02; p->pLbView = ui->lb_view02; mVecUserView.push_back(p); p = new User_view; p->pLbUserName = ui->lb_userName03; p->pLbView = ui->lb_view03; mVecUserView.push_back(p); p = new User_view; p->pLbUserName = ui->lb_userName04; p->pLbView = ui->lb_view04; mVecUserView.push_back(p); p = new User_view; p->pLbUserName = ui->lb_userName05; p->pLbView = ui->lb_view05; mVecUserView.push_back(p); } void MainWindow::removeUserView() { for (int i = 0; i < mVecUserView.size(); ++i) { delete mVecUserView.at(i); } } void MainWindow::addUser(const String& uid) { if (nullptr != mpEngine && mpEngine->IsInCall()) { auto iter = mMapUserInfo.find(uid.c_str()); if (iter == mMapUserInfo.end()) { Dictionary dict; mpEngine->GetUserInfo(uid.c_str(), dict); User_info* pInfo = new User_info; pInfo->strUserName = dict.getValue("displayName").c_str(); pInfo->vt = AliEngineVideoTrack::AliEngineVideoTrackNo; mMapUserInfo[uid.c_str()] = pInfo; } } } void MainWindow::removeUser(const String& uid) { if (mpEngine->IsInCall()) { auto iter = mMapUserInfo.find(uid.c_str()); if (iter != mMapUserInfo.end()) { delete iter.value(); mMapUserInfo.remove(uid.c_str()); emit sendUpdateView(); } } } void MainWindow::removeAllUser() { for (auto iter = mMapUserInfo.begin(); iter != mMapUserInfo.end(); ++iter) delete iter.value(); mMapUserInfo.clear(); } void MainWindow::updateUser(const String &uid, AliEngineVideoTrack videoTrack) { if (mpEngine->IsInCall()) { auto iter = mMapUserInfo.find(uid.c_str()); if (iter != mMapUserInfo.end()) { if (iter.value()->vt != videoTrack) { iter.value()->vt = videoTrack; emit sendUpdateView(); } } } } void MainWindow::updateButton() { ui->pushButton_left->setHidden(mICol == 0); if (mIShowNum >= 5) { if ((mMapUserInfo.size() - mICol) <= 1) ui->pushButton_right->setHidden(true); else ui->pushButton_right->setHidden(false); } else ui->pushButton_right->setHidden(true); } void MainWindow::updateBeauty(int iWhite, int iSmooth) { AliEngineBeautyConfig config; config.smoothnessLevel = iSmooth / 100.0; ui->label_smooth->setText(QString::number(config.smoothnessLevel, 'f', 2)); config.whiteningLevel = iWhite / 100.0; ui->label_white->setText(QString::number(config.whiteningLevel, 'f', 2)); if (nullptr != mpEngine) mpEngine->SetBeautyEffect(ui->checkBox_beauty->isChecked(), config); } void MainWindow::on_pushButton_left_clicked() { if (mICol > 0) { --mICol; emit sendUpdateView(); } } void MainWindow::on_pushButton_right_clicked() { if (mIShowNum >= 5 && (mMapUserInfo.size() - mICol) > 1) { ++mICol; emit sendUpdateView(); } } void MainWindow::on_checkBox_muteAudio_clicked() { if (nullptr != mpEngine) { mpEngine->MuteLocalMic(ui->checkBox_muteAudio->isChecked()); } } void MainWindow::on_pushButton_Screen_clicked() { if (!mpEngine->IsScreenSharePublished()) { configScreenDlg dlg(mpEngine, this); if (dlg.exec() != QDialog::Accepted) return; ui->pushButton_Screen->setText(tr("ֹͣ����")); } else { mpEngine->StopScreenShare(); ui->pushButton_Screen->setText(tr("��������")); } } void MainWindow::on_checkBox_beauty_clicked() { if (nullptr != mpEngine) { AliEngineBeautyConfig config; config.whiteningLevel = ui->slider_white->value() / 100.0; config.smoothnessLevel = ui->slider_smooth->value() / 100.0; bool bcheck = ui->checkBox_beauty->isChecked(); mpEngine->SetBeautyEffect(bcheck, config); ui->slider_white->setEnabled(bcheck); ui->slider_smooth->setEnabled(bcheck); } } void MainWindow::updateView() { int nCol = mICol; int nIndex = 0; QByteArray arrUid; User_view* pView = nullptr; User_info* pInfo = nullptr; for (auto iter = mMapUserInfo.begin(); iter != mMapUserInfo.end(); ++iter) { arrUid = iter.key().toUtf8(); pInfo = iter.value(); if (nCol > 0) { if (pInfo->strUserName == ui->lb_userName01->text()) { AliEngineVideoCanvas canvas; if (pInfo->vt == AliEngineVideoTrackBoth) { mpEngine->SetRemoteViewConfig(canvas, arrUid.data(), AliEngineVideoTrackCamera); mpEngine->SetRemoteViewConfig(canvas, arrUid.data(), AliEngineVideoTrackScreen); } else mpEngine->SetRemoteViewConfig(canvas, arrUid.data(), pInfo->vt); } --nCol; continue; } if (nIndex < 5) { pView = mVecUserView.at(nIndex); if (pInfo->strUserName != pView->pLbUserName->text()) { AliEngineVideoCanvas canvas; canvas.displayView = (HWND)pView->pLbView->winId(); canvas.renderMode = AliEngineRenderMode::AliEngineRenderModeStretch; canvas.renderMode = AliEngineRenderMode::AliEngineRenderModeAuto; canvas.mirrorMode = AliEngineRenderMirrorModeAllNoMirror; mpEngine->SetRemoteViewConfig(canvas, arrUid.data(), AliEngineVideoTrackCamera); pView->pLbUserName->setText(pInfo->strUserName); } if (pInfo->vt == AliEngineVideoTrackBoth || pInfo->vt == AliEngineVideoTrackScreen) { if (++nIndex >= 5) break; pView = mVecUserView.at(nIndex); if (pInfo->strUserName != pView->pLbUserName->text()) { AliEngineVideoCanvas canvas; canvas.displayView = (HWND)pView->pLbView->winId(); canvas.renderMode = AliEngineRenderMode::AliEngineRenderModeStretch; canvas.renderMode = AliEngineRenderMode::AliEngineRenderModeAuto; canvas.mirrorMode = AliEngineRenderMirrorModeAllNoMirror; mpEngine->SetRemoteViewConfig(canvas, arrUid.data(), AliEngineVideoTrackScreen); pView->pLbUserName->setText(pInfo->strUserName); } } } ++nIndex; } mIShowNum = nIndex; for(; nIndex < 5; ++nIndex) { pView = mVecUserView.at(nIndex); pView->pLbUserName->setText(""); pView->pLbView->update(); } updateButton(); } void MainWindow::updateWhite(int values) { updateBeauty(values, ui->slider_smooth->value()); } void MainWindow::updateSmooth(int values) { updateBeauty(ui->slider_white->value(), values); }